{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"top\"></a><img src=\"./source/SpinalHDL.png\" alt=\"SpinalHDL based on Scala\" style=\"width:320px;\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Before running Spinal HDL code, be sure to load SpinalHDL Libraries  \n",
    "**Note** : This may be a little slow when the first time load, please wait a moment to download Lib from remote.   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val path = System.getProperty(\"user.dir\") + \"/source/load-spinal.sc\"\n",
    "interp.load.module(ammonite.ops.Path(java.nio.file.FileSystems.getDefault().getPath(path)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## FixPoint\n",
    " **$\\color{#FF3030}{Note}$**  this only available on Spinal1.3.7 and higher"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  Safe Adder Extensions \n",
    "| operation | description          | return               | state |\n",
    "|-----------|----------------------|----------------------|-------|\n",
    "| +^        | add with carry(1 bit expand)           | T(max(x,y) + 1 bits) | new   |\n",
    "| -^        | sub with carry(1 bit expand)           | T(max(x,y) + 1 bits) | new   |\n",
    "| +\\|         | add with saturation without bit expand | T(max(x,y) bits)     | new   |\n",
    "| -\\|         | sub with saturation without bit expand | T(max(x,y) bits)     | new   |\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val a, b = UInt(8 bits)\n",
    "    val c = a + b //return 8 bits without protection, may cause overflow\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val a, b = UInt(8 bits)\n",
    "    val c = a +^ b //return 9 bits, adder with carry\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val a, b = UInt(8 bits)\n",
    "    val c = a +| b //return 8 bits with saturation\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhEAAAB2CAYAAAB28MHZAAAgAElEQVR4Ae2dDaxUxRXHB0RjGyj6UkMVsNSK1oRWrKjEgGhM2hiM9Kk1kEiFoBCiRWygNRIEJRgSDAUKMVQNGEw1hooYqDEpwYIxpH1aTWxaakVKU9SYYg22tdr2Nb+p53b2vrv79uN+7e7/JPvuvXNnzjnzn307Z86cmRnS39/f70RCQAgIASEgBISAEGgQgaEN5ld2ISAEhIAQEAJCQAh4BGRE6IsgBISAEBACQkAINIWAjIimYFMhISAEhIAQEAJCQEaEvgNCQAgIASEgBIRAUwjIiGgKNhUSAkJACAgBISAEZEToOyAEhIAQEAJCQAg0hYCMiKZgUyEhIASEgBAQAkJARoS+A0IgZwQ2b97sHnjgAffhhx/mLLl1cY8//ribOnVq64xa5NAohm+//ba7/vrr3dKlS1uUXF9xMAIrkRDodASGaLOpTm/izq4fHfHGjRt9Je+5556KytJRQ4sWLXLDhw/3HXdFhuDB8gRJdd3SUbzwwgvukUceqSs/ndm0adN83t///vcVZegY9+7d69577z13/vnnu3POOceFdbL6VBT69CEP/anr7Nmz3fjx493u3bvdeeedN0AV8hw9etSNHDnS3X777QPeU/+tW7e65557ztfxyiuvdDfffPOAfIMl0Em/+OKLrq+vz1188cWDZfdtv2zZMp+vWhnacc+ePe62225LrNugQj7NQLtee+217o033nDbt29vqn71ylI+IVA4AhgRIiHQrgj09fWx42r/+PHjB1SBNN6RB7Jn0uIfyzOAySAJ8EySXa3YkiVLvOzVq1dHWZBdTbdQr2p5wjpGTOu8qVf/ffv2RTiHOpkY3k+ZMiXClfs4hfUM65KUN142/myyknSJ5+UZ/ZBZS1ajPJPkWFpYV2SLhECnIqDpjMLNOCmQFwJPPPGEH7kuWbLEi5wyZYp/rjYyzUKvXbt2+ZH83LlzI/aLFy/2o9ZQH3TatGmTGzFiRJSvSP2XL1/u9bjzzjsHjPyZIrjqqqu8ZwAvRTWaNWuWr+e8efMco/V9+/Z5LPAo1PKyVOPXSDoeD2QeOHCgkWJN58U7MmfOHF/esGuamQoKgTIj0KnWkerVHQgw4mMkzigzTjbajY9W8QJQJmlUyjvKMXqcN2+ev7cR7LFjx7wIy2P8TT7PfEIvQ6jT9u3bvVz4hmR8du3aFSZXvc9bf9M7CS+UNC8E12q6VeOxadOmqu1XFYD+/sjrAWa9vb1RO3EfUvjO2id8bx4Da4N4W8b54UkyPnaN5wn5G1/qLxICnYiAPBFltvCkWyEIMJfN6PHRRx91o0aN8jowWrY5fub7Sbd3ZLBnrrxPoi1btvjkajEAeEjSCMZLW/+nn37a6z1z5sykajlG+YzwuVYj4g2ga665JspCXTds2BA9N3MDZq+//nrUFjt37nS33nprxKqnpydqG3CJE54eazvzotgzV8obwffBBx/0j3gZ+MyYMcNeJ17tvWGYmEmJQqCdEehEy0h16h4EsvBEMBrlY6NHRrs2Qo0ja6PReHr8mVE6PJJG8zZKN7nwrObNgG+10X74Lk39bTR96NCheLUGPFfTzeINrF54YwxTq3fcYzSAeZBg/NDNyhmOpMWp1vfE8hpP42fpdrX3eCPqpXrk1stL+YRAGRGQJ6KdLUDpnhkCjHDNYzB69OiW5dgKkgULFgzghRziA3p7e/07RsysJGD1w8svvzwgfz0JaevPKD1pNUY9uoR5Dh8+7JeI4uWhvqzyMA9AmK/eezwDtjoDHOEFfs3iVkvuGWec4V8jE6+EeVdqlUG3VupXi7feCYEyICAjogytIB0yRSAMTqxX0Omnn15v1kHzsawRlzudiRkm8UJMBeDyPnTokCPwEKIzJOiyGUpT/2bkVyuD8cDU0OrVq319zTABm7POOqtasarpaRh4VZnHXtA+GD7oSj0IJkX/rINCY2roUQiUCgEZEaVqDimTNgL84FtHlTbvevmtW7fOGwQWrV+rHLqy5wSeBOjdd9+tlb1t3k2ePNnrSnvgdbH9L/AYWKzCmWee2VJ9MNaMmjEcrWytK4bEL37xC79yhtU05jWK7/lhPEKdLE1XIdBJCMiI6KTW7MK6mLuYH/PQvUzQnnVOWcOCnGqdCLKTlnWaTmyWlVT2/ffftyyZXwfTHwXi+Daq1PTp06MibKRl9NBDD/nbK664wpKavrKJFXrSubdiOB48eLCmDhg7BNmyYRZGEXTixInEMniW0IkgTZEQ6EQEhnVipVSn7kJgwoQJ/od6/vz5zjqj/fv3exDC0T/bHrMbpI3uudoWzrinm+l46BzoJJiCYOUBnf+4ceOilRxmzPA+aaRNJzNp0iTfGVlHg17whNiXwagI/ZENpuhDXZJWYODO37Ztm6npr0xZGJ7sb0E5pgJYPcGOnaxaePPNN/0zHfGqVasqytf7wLQI+BFrQRtC4dbWhpnxox7W5hgz4U6jPKM3K0aOHDnimBKCr+WhPmDBTqIQ7+CH/tWmYsAMqrayxb/UHyHQxgjIiGjjxpPq/0MAFzOdBXEH1pHww04HY25zcvLeyEaQZlCEI0l7Z3m5JqWRvn79eh+3QOfDh3yh4TLYsk7c7sab8iaLNAwIW1ZKehH6I/f73/++xxXDDPd8kjHkFf/0j9UnTOM+bCeCE8mHYbFmzZpBecZ50eHTdmCCYQIvPBAYENddd12UvRZmFihpmTEWjh8/7nnaUk70CwkMwu8YMjGAkjABK/KjG99PkRDoRAR0dkYntmoX14k5djpmGwXnBQVTEhgijEitQ2F6heA7Opp6dkq0FQUhjyL1D2WzGoHOk04VY6BVoq5p1RNetkKjVb0oT+d/7Nixqt+jetvJMCO+Ze3atWmoJh5CoHQIyIgoXZNIoU5BwLwj9957b9VVGe1UVzv0iqkZc/G3k/556soUD8t06zUg89RNsoRAmgjIiEgTTfESAh2MACNwO/+CFRZJ8REdXP26qwZOFufCSg7zTNXNQBmFQBshICOijRpLqgqBohGgg/ztb3/bEZ6VLLF89tln3SWXXCIDIkuQxbsUCMiIKEUzSAkhIASEgBAQAu2HgPaJaL82k8ZCQAgIASEgBEqBgIyIUjSDlBACQkAICAEh0H4IyIhovzaTxkJACAgBISAEaiLAsvM8tl2XEVGzGfRSCAgBISAEhEB7IcBOqWzIxu6wWRsSMiLa67shbYWAEBACQqBBBFhVxAZ0eW9C16CaVbOz54zpb1f2bal2guwHH3zgebEte7gbbyiAzdDgBTatkLa9bgW9nMuuXLnS3XfffTlLlTghIATyQICzOr71rW85Nic77bTT/BkeJnfFihX+gDn2nYA4n+WWW25xjz32mD/ngzTOI5k4cWLFbwRbp//1r3/1+cgDX9LYTdV4Uebcc891P/vZz9y3v/3tzGVzIN2rr77q64Hsyy67zP3rX/9yY8aM8WlZ/bFzTrLinyVfzvxBfzYvM7Kt9nkOt/fn2bbLHzt2bFXDyQ6HM37NXmVENItcgeX4Qcmb7MeqCNk/+tGP/JkGkp1fqxeNOZ3KXXfdlV+FP5VEvYuS/ZOf/MQ988wzjqPjTz31VO+KDgHAcDDCGIAuvPBC98UvftHff+ELX/BXXNhG8CGvpfEMhbwoR8fe39/v82YtGzf7yJEjvR7Ifv75572hEx42Z/oXcSWWYMeOHZHoyy+/PNpYjWmCo0ePuhtvvDGxczbPQNipb9682Zln4Oyzzx6wx0pYBv6vvfaaP/xt7ty5A/YZ4awe2+LdtlXnNFmTF8qiAsgNz5Lh1OCNGzf6utm5QU8++aRvAxJpFzNAIgAGu+kXtQ0CK1as6HeO//X8adq0aYXJPvfccyU75yYvGvMxY8bkXOP/iaPeRcmeMGFCf09PTyH1XrNmTf+6desKkb1t27b+9evXZyq7r6/P/4aMHz++ppwlS5b4fPzOhp958+b5cqtXr/bpXJMI/ibj2LFj/VOmTInkkg7P3t7eiqJWBhmhTNLhARkf6mFkuob8LJ/xMV2sjOFg7+NXyjdKiokYzMrSeyEgBISAEOh4BJjisdNbOQG4r6/PnwRMxTl8jvfmQXn//fer4jFq1Cj/jhE9Uw6cNYN3g+kjpiM4ddaOiDcmTFUgw+SSj7StW7daFn9lt1hiGCiP94gTYhctWhTlgQd6b9++PUoLb/Bi8J6PTY2Q19Io3yhpOqNRxJRfCAgBIZABAh999JH77Gc/mwHnwVn+4Ac/GDxTRjmI7SgDmZufTt+mB6zTtY5/4cKFXtWDBw/6qx2yt3v3bh/ASMc/YcIEvyKCY+jp5O2wOs5QmTx5sjcsOAn35ptvrqg2BoTJveaaa/xR94cPH67IM3v27OgZ3sTBhGfY1BM4atMhxuiCCy6IpkgsrZGrjIhG0FJeISAEhEBGCAwbNsx98sknGXGvzZazPnp6eqLRae3c6b4lyBIDig62SCJ4Ebrooosq1OAwNYwIAhE5vp7Om3gC4gswFDAcHn74YTdz5kxfjvwcJU86lNSxm6xQ0De/+c3oEWPCDIoo0TnHsfIE4ELbtm3znhMMmgMHDoTZcr2XEZEr3BImBISAEEhGoEgjAjf5KaecUogRQSAhK0iKNiKsVWzKwp7Da3giK0GwZigwtWDBqgRPGmFwzJkzxx6jay0ZUaaEGwwV8yQQ8HnVVVd5zwbTJUnGSgKL1JNkRKQOqRgKASEgBIRAuyKAURNONRAvAJmRQ8wDnogtW7Z4rwRTCsRS/PrXv/b5mB4IKcmjEL5v9h6viFG1vSDsfa1rK2XhKyOiFrod8I7dypYvX+7279/va8N83Zo1a3KzWlmGZLL551u6dGnFkqMsIGaeMsldaLKw5htexmSF67yybIulV/zYUG/mOLP6MQlVYokXS7bidMYZZzjmYfMkNsPJS26R3/O4bNp7wYIFFR1RPbiztPTkk0+uJ2vqeUaPHu3CEXTqAmowZJnn8OHDa+RI91V8c6URI0b430PajEBIDAK8ChgNTBUwlQFNnz49UgQPBB/iJ0inDL9zeB7MU0DgIvz4DVy1alW0XBP5LHNtps54jCA6fn7XIeSYTKub5eO9pVk9faHgD0GaFlfRjEdDRkQAZqfd8uNm68OxlplLw6q+9tpr3RNPPBF98bKqN50InSiyWc9OJ8Y9rr9w7XJW8uN80YV/fAyZLMnWbzN/Sb2J6l62bJkjonvt2rVZivYGhBkumQoahDkY8ANqEeCDZG/ptX3P6bxtrwEMKb7nBLxl6eYNZZvbmmA4AuAY0TbS3kUaEeHIu6XGaKJwGAvQRPGGivD/T8xCSHxHiSkAA7wLfG/vuOOOMItfNWEdLQMC8kCUIR3jAd5cjdjTYdasWX7VhQ2keEc+foet47f89VzDwEryIw85RsiDv1FYX6unveN3kHqwIsP043+o0fgKGRGGaAdezVKNGwyM1BcvXtzwl6URiLBu+YKGBgP/cPyg88OapRGRNOLGwqZTYeSQpWwMBv4pN23aFHk77AcaLBrpVBrB2/JiQOBtSsLA8mR9JUivmaVizepl3/OnnnoqGu0R8f/1r3/d3X333ZlikSTb6kF7f+9734t0svRqV2ISiA0ogn784x/7jaZuuumm3MWz2RRBijfccENmshn5s/ohicL4BDpQfrv4PyaQEm8EngYzIChPLILxsnQ8EQRZhrwwEljWyTJNvJIQ/PByhAaEGZ/oWI3wnmK8hBRugmXpxsuew2uoG+n8Du7bt8/Xl7riNbz66qvDInXdy4ioC6b2zIR1iWUZfmGpCUYEFm0zrqt6kWBXN6zkSy65pKII+tDR5U0YD8i25VZZyWeZGPWOT5cwWuAfNQ+Kj7TykGky6AzwwPChE82DiKY/55xzKjprXMW0d61prTR0O378uDfawoA7+PIDjSFFlH78XTW5Q4cOdf/5z3+qvc40HS/Z3/72t0xlVGP+zjvvZG488X2odzoRo98M/ySdMRzMeLD3tHfS4IS2R24t2bXeGf/474mlx6/18ArLJNUlfF/PvYyIelDqsDwW+PPLX/4yM1cvVjIufEbE9g9AB2Mj5TwhJT4BrwhWd9bEaOSKK67wYjDSLGgJQy5uzKWtC3OfuC/BntEUhhyjD8M/bXlJ/L7zne/4ThWPS15GRFL9wILvmrVFkq5ppFXz+JhLmHlokRDoZARkRHRy61apm22UQieTFWHh4vJjbnHv3r3uy1/+su9UGB0S/JcnsZ66t7d3wOghKx2IPQkDSunYmY9kZJrl/DxuYWj+/PkVVduwYYPDXR0fPVVkSuGBdsWIsoOdUmDZMAt0IEoeLxzTOll7npIUJE4CA4o2b6S9P/74Y39mRhLPrNNwsxcVWEncEPtEiNoTAW173Z7tVpfWzI8xAmdUasQIjU4lD7KtYXEpm+HCvJuNzvPQAS8EnXi4NWzWculAmLqgM8UbwbayjIqZUsmSCOhjKoXgQuTyIR4GihsWaeuBLL5XyK7XfZ+2DvDDgLBpI753FpmehaxqPC2uoNG4EKYymNIoggjA/tKXvlSEaH/yKEaMqE0RaPSwDeUvDoFmDuCyA1k4iIV7rps2bfLXaofIJNWw0QO47HCY7du3R+xOnDgR6RAl1nHTymFQVu86xCRmaVQ28vhQ15Ds4J7wAJ3wfdJ9o7KTeJBGG3DQDu1eLzUqm++WHVJkMprFHtmtHoLVynetWdm0rf2PNdLOhpcO4DIkdG0nBIoxe9vU4GpHtZmbZSSMV4LoXtzaWP02d55VncydGwYoEdzEemlkh96RrHSwGAHbjjYrOXG+TNnE14DbMjabcoiXyfLZYmDsOOK0ZTGFgKeFaRw8P/ZBDuk8E+2eJ+X9XaN+LK+jvvHVUHnWW7KEQN4IKCYib8QLkBd25IjnRx+3d60lRWmomcTfAs2yjMcw3dkrgHqyGiUvwoCoRfFlVrXyNvqOzjrvQEp0NOMkHkiJsQgRkwJlFZNRrd55fdcwiFntRAwES/niBqSvvP4IgQ5FQEZEhzYs1bKdGy1S3KpK50pnl+XcNfxtAxOTy9V2UmMFQdZkcRhZ1jNeB7w8dKYE14Vy8UBkbdDYDpnx1Qrm/bjxxhvj6qbyXG0JG0GFfA/i379UhAZMiqo3KuCBMAOi1XoWeYon+2p8/vOfD1DN7xYvHRttiZpHgJgkjObwN6d5bo2V1HRGY3i1VW4LrGSlAJ0aH9tJkGmFLInd0BiJIo8vOMSI7f777/cjtqxGpWGdcC0P5hkI86dxv2LFCs+G4Dpz4eP5Ybkryw2z/CdPwpxROrIJ6mxkpUAaWOTFI6w333Eor3qz2RTGIcYjMuMfljXXS0XuE/GXv/zF/fnPf65XVeUrEQL8ruL1JTjWvv95qidPRJ5o5yyLzU9YZok72ba/plNlpJx1J45sYjEwGohS54cWoiPNc9ldfJe3rJsAVzZbLbNTYrgigk4863pXw5yNn7LeKbMarqzGyZrCetv3HJlZ1xvjGEMVik/lWJ0ZZde7Pwg7Vha11JHvLPLvuusuUz23K54yduq0LctzE1xyQbZMfLAYG5tOZNDGyrcsBypJkMmISEKlg9LM1UyQIe6uPEejtvMbP7Z8uev9MU0LfvOApMWvXj5gzCZEjArYsTDPehvmtrQxT9lxfPLEv4h608551jGOr547GwGWKltcUa2a2vTl2LFjc/19N51kRBgSHX4tsjPJ03ApUzMyIsh7VGD1L7K9TYciru1c7yL3icALUdR3NavvCdOJL730UsR+7ty5FXVk6skCkZkSsGDveD4YMCDgDAyj+LkVJot0phbIyz45bKQVD2w3WbxnRRObfFkepr/YOh8yLxcxbBbXZPrynmlS80LwzD1euSTC2N2xY0f0Kq6/8WLQaXUhczxfxCC8aaf1qN2uazP7RKSFWaP7RKQlFz6N7lkg2a0jUDTmze7V0GrN09ijolkdipTdrM5lLdfb2+v3RmF/FPuwb0m4b43tY2J76YT5jh07FlVt165dfu8X3lPG8oX77Ng+MOyVEuYhL3vmGFk+8oT50AFifxHjn3S1fORN0tvkhFfbsyfOL9zXBV7oQ1qYj7RDhw6F7AbcK7AytKh0LwSEgBAoCIFhw4a5Tz75pBDpnLzK7rZF0KuvvhrtaJuGfDwMO3fu9HFYxGVx7DYxSUwNEKMVEnXmw6m75GOZLvnsdFbyEltDGrwY0XMGDzFexJrFAxmJ/yLujDzwhMJ4GUb2vINPyAsd8ADgSUMP04XyVgfSwl1QuSeN99UInpwwChEfR347gZTyvDeijqSBlckn7eGHH7YsydcBZoUSSouAPBH5N03RI3JGBUVQ0fXuRk+EdqxM55tuI/zQ6wDneHr8mTy2uyvvwufQA0C6eQFsF9jQwxDuVgsfPqFnwzMO/hiv0LMRyhhs91PzXpjOAet+88iEXgfex9NNhzCf1Sle95A/94qJSLatlCoEhIAQEAJtjMCll15aoT0eAkbWFvvASzwKFo/As+3uagUtL56CMLYLPlAYk8AzMsLNxvA2xAlPie1twjvjFc+XxjPnx0AXXXRRBbtJkyZ5b42dM2MvFy5caLd1X2VE1A2VMgoBISAEskOADZdOPvnk7ATU4Ezn2dPTUyNHdq+yOMUT48B2LE1Dc04BpuONE9MTjdDUqVP99An6zZgxwwdWMi2SpSGBflnulCsjopFvgPIKASEgBDJCoEgjolpUf0ZVrWA7ceLEiuc0HuiUf/WrX1WsVrDVDrU6flZCQHgU4sTKhVaIZdd4NDAgXnnllchjgVeilhGRxqnHr732WoXHhZgHKI3TUxVY2cq3QmWFgBAQAikhcOqpp7q///3vKXFrjM0Pf/hDt379+sYKpZSb5Ys//elPU+L2vw3tYEZAJAGjdN5s3ERHTQce32jPgiMJMrQgyAULFnh9WO5JGQI1WQZpRJkwKNHS673aNAK7rWJY1CKWhBqF0yPUi48dJUAeS7N8Vg+CK9Gf91ypDzR9+nRj3fRVnoimoVNBISAEhEBnIPDxxx/7HSuLqM0777zjd6xMSzZb+nNuD0YDUwZGGAOcYhwSeWyXU/MGsDrB4iTYO+Pee+/156PccccdbsOGDWHxhjYbY+UFqz8wGjjx1cjS7NmuZmCwYsLOIcJDYme0wMN0pgz3NuUCT/JRjy1btniZ6B8SqzTiBlX4vt57GRH1IlWifEOGDClMG8nOH3ph3h2Ys+lQfz/L9J3vrNgKGqIjHDduXEUHxhktLI20kTPvOUSLZ9IhOkc6ifvuu88/84c80GOPPeavp512mt9umnM72HAKoqM02eQnT9h5Niubba3hG5eNByZNouNnJM6Ie+/evY7gQra/T9pECsMCfDmsj7OGkjZXoiMeM2aM27NnT7QUFX60lxHl6JQHiz146qmn3Lp16zwfphJuu+02v6stm2LFp1mYYmI5KJ4IPBdsIX/11VebSK9v9BC7CfXAmIAHnhP4IBcPRGhAzJw502MUnrxcb52GsEQjJl+PJUWAL0ErLrRWqnXkyBHHJ/zitcKvkbK/+93vHKMVyW4EtdbyFo05nU0a87WNokC9i5KNAfDHP/7RHT9+3Hcydo7GV77yFd+R26m01In/Bf4n0Beioye2wNqNNAwLPuFvhsUfmKFBBw7OP//5z/1UCh0Xckw2+cmThmzkwDcum98V6pJ3e9tqC3P9eyD1p2EEZEQ0DJkKCAEhIATSR4CRMh3+W2+9lT5zcRyAgIyIAZA0laDAyqZgUyEhIASEgBAQAkJAMRH6DggBISAEhEDXIaBpjHSaXJ6IdHAUFyEgBISAEBACXYeAjIiua3JVWAgIASEgBIRAOgjIiEgHR3ERAkJACAgBIdB1CMiI6LomV4WFgBAQAkJACKSDgIyIdHAUFyEgBISAEBACXYeAjIiua3JVWAgIASEgBIRAOgjIiEgHR3ERAkJACAgBIdB1CMiI6LomV4WFgBAQAkJACKSDgIyIdHAUFyEgBISAEBACXYeAjIiua3JVWAgIASEgBIRAOgjIiEgHR3ERAkJACAgBIdB1CMiI6LomV4WFgBAQAkJACKSDgIyIdHAUFyEgBISAEBACXYeAjIiua3JVWAgIASHQGgIffvih27x5cyKTW2+91b3wwguJ7xpJRMYDDzwwaJF68gzKJMiwdOlS9/jjjwcpuq2FgIyIWujonRAQAkKghAhcf/31burUqf5Dp533sdaHDh1yTz755ABk6NCPHz/urrzyygHvGk1AxrZt22oWo97Lli1LNGgwcqoZOrWYzpw5091///25Y1pLpzK/kxFR5taRbkJACAiBBARef/11t2DBArd+/Xr/dt68eQm58k16++23faffTMfdrKbnnXee6+vrc7fffvsAFh988IHj0yhdfPHF7s4773R33313o0W7Mr+MiK5sdlVaCAiBdkfgggsucHR4CxcudO+++25FdfBU0MHywT1vhKeAd0bh88svv+zfkWZln332WcvqpyjwfvBu1qxZUbrdLF++3M2YMcOdeeaZluSvyGN6wHQK5VdkTHgYNWqUn9IwfcJpBuOHLuhuxD358WLwsbLUywjvjaVTpzhhlGCopTEtE+fdac8yIjqtRVUfISAEugYBRv8PPfSQmzBhQlRnOteenh7vjn/llVfcwYMHK9z67733XpSXm/B5586d7vDhw74so/G1a9f6vMiZP3++W7VqlX/34IMPVvDgYf/+/Y6pgDjBn+kBph3Qh8457PTj+cPnF198MdIHmfAxevrpp70uGBohYVgxzTFnzhz/4Z7PPffc47PhKWGqxNIPHDgQFo/uMYj27NkTPesmGQEZEcm4KFUICAEhUGoEFi9e7KZNm+ZjEOhQjeikH3nkEf84fPhwP+2RFL9g+cPr+PHjo7KTJ0+OPBxbt271horFOowePTosFt3TgScRHTrv0IdO//nnn0/KNiAt1Oe6674rLGwAAARgSURBVK7z7+s1QAYw+zRh7Nixvl6hVyMp7+mnn+4NsKR3Svs/AjIi/o+F7oSAEBACbYMA8RA2sje3e1IHy7RHGjRp0qQ02BTOA2MErwaGF1Ma4XRP4cq1oQIyItqw0aSyEBACQgAEGNkzyt+4caMHxDwBTD8Y4YU4//zz7bHiytRFvUQAo1E1TwJTBFmR1cnq2IocDAmMCIywXbt2VZ1eqYZbK7I7reywTquQ6iMEhIAQ6CYE5s6d6wMI6cAZWTOXf9NNN/n4hZdeesl3krt37/aQXH755T4vAZN8iGOIxxQkYWcymAI4evSoe+655wZkIy5jx44dUezBgAxNJiBzzJgxjsBNDCYjC5QkqBRDCcNm0aJF3rAiz9lnn+1jKLhC8GA6Bq/Nb37zG8d0DfEi0FlnneWv4R/qyAoYUW0ETlq5cuXK2ln0VggIASEgBLJGgBHxkSNHHLEOg9GJEyfc9OnT3SmnnOJGjBjhhg4d6j7zmc+4cePGuW984xs+ndgIaMOGDT6de94z1//GG2+4Cy+80HeyJ510krv00kvd5z73OffPf/7T7z1B3vAZGV/96ld9UOTIkSN9wOW///1vX84Lcc4bIwRefve737Ukf/3HP/7h4yGQDcWfKzIHD3Ts6IrR8qc//cndcsstbvbs2VEOC4icOHGirzsvLrvsMl937r/2ta9F5VnqSSwEOoDxH/7wB/fmm2/6+oJPfEUJhsa+ffuiJbSRUN0MQGBIf39//4BUJQgBISAEhECuCDDap/N66623cpWbpjCWTkIW2Jkm7zx5sewTg8gCSfOU3W6yFBPRbi0mfYWAEBACJUUA44HlkxboWVI1a6qFIcQ0hgyImjBFLxUTEUGhGyEgBISAEGgVAZtmaJVPUeXb3YuSN24yIvJGXPKEgBAQAgkIsBLgo48+SnijJCFQXgQUE1HetpFmQkAICAEhIARKjYBiIkrdPFJOCAgBISAEhEB5EZARUd62kWZCQAgIASEgBEqNgIyIUjePlBMCQkAICAEhUF4EZESUt22kmRAQAkJACAiBUiMgI6LUzSPlhIAQEAJCQAiUFwEZEeVtG2kmBISAEBACQqDUCMiIKHXzSDkhIASEgBAQAuVFQEZEedtGmgkBISAEhIAQKDUCMiJK3TxSTggIASEgBIRAeRGQEVHetpFmQkAICAEhIARKjYCMiFI3j5QTAkJACAgBIVBeBGRElLdtpJkQEAJCQAgIgVIjICOi1M0j5YSAEBACQkAIlBcBGRHlbRtpJgSEgBAQAkKg1AjIiCh180g5ISAEhIAQEALlRUBGRHnbRpoJASEgBISAECg1AjIiSt08Uk4ICAEhIASEQHkRkBFR3raRZkJACAgBISAESo2AjIhSN4+UEwJCQAgIASFQXgRkRJS3baSZEBACQkAICIFSIyAjotTNI+WEgBAQAkJACJQXARkR5W0baSYEhIAQEAJCoNQIyIgodfNIOSEgBISAEBAC5UXgv2tzKJhsS7zmAAAAAElFTkSuQmCC"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### LowerBit Operation \n",
    "\n",
    "![image.png](attachment:image.png)\n",
    "\n",
    "About Rounding: https://en.wikipedia.org/wiki/Rounding\n",
    "\n",
    "| SpinalHDL-Name | Wikipedia-Name  | API         | Matmatic-Alogrithm     | description | return(align=false)      | Supported |\n",
    "|----------------|-----------------|-------------|------------------------|-------------|-------------|-----------|\n",
    "| Ceil           | RoundUp         | ceil        | ceil(x)                |-             | w(x)-n+1 bits | Yes       |\n",
    "| Floor          | RoundDown       | floor       | floor(x)               |-             | w(x)-n   bits | Yes       |\n",
    "| FloorToZero    | RoundToZero     | floorToZero | sign\\*floor(abs(x))     | -            | w(x)-n   bits | Yes       |\n",
    "| CeilToInf      | RoundToInf      | ceilToInf   | sign\\*ceil(abs(x))      |-             | w(x)-n+1 bits | Yes       |\n",
    "| RoundUp        | RoundHalfUp     | roundUp     | floor(x+0.5)           | easy        | w(x)-n+1 bits | Yes       |\n",
    "| RoundDown      | RoundHalfDown   | roundDown   | ceil(x-0.5)            | easy        | w(x)-n+1  bits | Yes       |\n",
    "| RoundToZero    | RoundHalfToZero | roundToZero | sign\\*ceil(abs(x)-0.5)  | -            | w(x)-n+1   bits | Yes       |\n",
    "| RoundToInf     | RoundHalfToInf  | roundToInf  | sign\\*floor(abs(x)+0.5) | common      | w(x)-n+1 bits | Yes       |\n",
    "| RoundToEven    | RoundHalfToEven | roundToEven |  -                      | -            |   -          | No        |\n",
    "| RoundToOdd     | RoundHalfToOdd  | roundToOdd  |  -                      | -            |   -          | No        |\n",
    "\n",
    "the **\"RoundToEven, RoundToOdd\"** are very special ,Used in some statistical fields with high accuracy concerd, \n",
    "SpinalHDL is no support yet. \n",
    "\n",
    "RoundType  difference see here: \n",
    "https://upload.wikimedia.org/wikipedia/commons/8/8a/comparison_rounding_graphs_smil.svg\n",
    "\n",
    "You can find **RoundHalfUp, RoundHalfDown, RoundHalfToZero, RoundHalfToInf, RoundHalfToEven, RounHalfToOdd** are very close    \n",
    "RoundToInf is most common. the api of round in different Programing-language may different.   \n",
    "In spinal we chose type of RoundToInf as Default RoundType, Api `round = roundToInf` "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val a = in SInt(16 bits) //source data is 16 bits                        \n",
    "    val b = a.ceil(2)        //ceil 2 bits           return 15 bits\n",
    "    val c = a.floor(2)       //floor 2 bits          return 14 bits\n",
    "    val d = a.floorToZero(2) //floor 2 bits to zero  return 14 bits\n",
    "    val e = a.ceilToInf(2)   //ceil 2 bits to Inf    return 15 bits\n",
    "    val f = a.roundUp(2)     //round 2 bits to +Inf  return 15 bits\n",
    "    val g = a.roundDown(2)   //round 2 bits to -Inf  return 15 bits\n",
    "    val h = a.roundToZero(2) //round 2 bits to zero  return 15 bits\n",
    "    val k = a.roundToInf(2)  //round 2 bits to +-Inf return 15 bits\n",
    " }\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**`roundToInf`** is most common    \n",
    "the api of round in different Programing-language may different.    \n",
    "In spinal we chose type of RoundToInf as Default RoundType, Api `round = roundToInf` \n",
    "\n",
    "| Programing-language | api   | RoundType(spinal) | Example                                                 | comments            |\n",
    "|---------------------|-------|-------------------|---------------------------------------------------------|---------------------|\n",
    "| Matlab              | round | RoundToInf        | round(1.5)=2,round(2.5)=3;round(-1.5)=-2,round(-2.5)=-3 | round to ±Infinity  |\n",
    "| python2             | round | RoundToInf        | round(1.5)=2,round(2.5)=3;round(-1.5)=-2,round(-2.5)=-3 | round to ±Infinity  |\n",
    "| python3             | round | RoundToEven       | round(1.5)=round(2.5)=2;  round(-1.5)=round(-2.5)=-2    | close to Even       |\n",
    "| Scala.math          | round | RoundToUp         | round(1.5)=2,round(2.5)=3;round(-1.5)=-1,round(-2.5)=-2 | always to +Infinity |\n",
    "| SpinalHDL           | round | RoundToInf        | round(1.5)=2,round(2.5)=3;round(-1.5)=-2,round(-2.5)=-3 | round to ±Infinity  |"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val a = in SInt(16 bits) //source data is 16 bits             \n",
    "    val k = a.roundToInf(2)  //round 2 bits to +-Inf return 15 bits\n",
    " }\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**`roundUp`**  has almost no performance loss than **`roundToInf`**, it is simpler on hardware implement with less area and better timing.\n",
    "\n",
    "So we strongly recommend **`roundup`** in your work"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val a = in SInt(16 bits) //source data is 16 bits \n",
    "    val f = a.roundUp(2)     //round 2 bits to +Inf  return 15 bits\n",
    " }\n",
    "showRtl(new Top)"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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sgaTwLJly3wXXcZf48GEqVaLgAiIQAYEOh68mYEuiRABERABERABEZjgBLrqCumEhS1epWhFJ7RURgREQAREQAQmFoHMHQvGECiJgAiIgAiIgAgMJgF1hQzmdVerRUAEREAERCAXAnIscsEqoSIgAiIgAiIwmATkWAzmdVerRUAEREAERCAXAnIscsEqoSIgAiIgAiIwmATkWAzmdVerRUAEREAERCAXAnIscsEqoSIgAiIgAiIwmATkWAzmdVerRUAEREAERCAXAnIscsEqoSIgAiIgAiIwmATkWAzmdVerRUAEREAERCAXAnIscsEqoSIgAiIgAiIwmATkWAzmdVerRUAEREAERCAXAnIscsEqoSIgAiIgAiIwmATkWBR43d96663ctG3ZsiUT2a+99lpbOXm0Iyv72xqvAiIgAiIgArkSqLRj8fTTT7v777/fLVq0yHV74+m2fL+UP/jgA/fEE0+kisGeG2+80eVxU7711lvdpEmTUnV3c+Lee+917ZyLu+++21+TWG47BnH58PjQoUMt+YVltS8CIiACIlBdApV1LNatW+d2797t5s+f7x5++OGuCe7du7frOv1UOHXqlHvmmWdSRWzYsMENDw+7rF8rj8MydepUt3LlylTdWZ/YsWOH27p16zix7RiMqxBk/PznP3ePP/64e+edd4Jc7YqACIiACNSNQGUdi5GREbdz5063ZMkSd/PNNztuzGHihsqTOp8wUkCEg7y33367cZ6IhyX2w6hBeIwcPgcPHvR1kWWJOjg7yKYOZSxxvGbNGnfu3LmGzrAu56l35MgRq9K0NbnUCW3jmOiBtZVtnHCgwvZznnpEe9CJncjHhm4SMqy+1UMPedu3b3eHDx+2bL9txwCHwWQi4+WXX26qP336dLd06VK3cePGpnwdiIAIiIAI1IzAWEXT0NDQ2Lx588ZOnTo1zkLyhoeHx06cOOE/lOOYxDnyZ86c2TjPsSXLTzrevHmz17l8+XJfly0f0sjIyNi+fft8PvvIMduQzznsMJvsHHUtjzpxoo7pow2UOXv2rC/GOY7Jj3VSwHQmyaQu562+2RaXjY8pz4e6Vt/sGR0d9W1Zu3btGKzC1I4B+sNrFvIxOehBdzdp6dKlY865bqqorAiIgAiIQI4ELq2qH3TgwAH/pE1//uzZs93q1at9twj20p0QdinMnTvXXbx40TclzCfS0Uvas2ePr0a0hCd/0sKFCxuikMtT++joqM8L9YT7ViEpj3NEI4hyvPLKKw05RDVou3Vt3HPPPY19ixRYG8+cOeNoe1JasWKFmzVrlj+FrFbdNHF9ujqsvXRHmT1XXHGFjx69+OKLcRWfb5lJ7aWdpKRzVo+oBQkurcpZeW1FQFIorJIAAAQ7SURBVAREQASqR6CyXSGg4kZK18CCBQvcHXfcMa77gRssIXi6TfJIjO8wJ4ObHSF8Pui0G2U/erlBT5s2rUnEnDlzGk4SJ6666qqm8+ZAWWZ83vLNqYjl2/lW209+8pNNp2OdTSc7PNi/f793brhmdIkoiYAIiIAITEwClXYsDDlP3ENDQ+6NN97wWYwZmDJlinc6eJqmb76XxCyGThNjKBYvXuyjC+js5YYd67rlllviLHfixImuZnicPn16nIysM6677rq+RRKBIDJz9OhRL6vVmI8rr7yyb30SIAIiIAIiUA6ByjoWDO4jSsCHAYg4FXSJkN57770GLboq0maA2KBGZFjCITh+/LiffXDXXXf5QZ52rtMtgyhfffXVpuLcDIli2KDEcBCmtYMK4T4REeqYnbSFdra66YZKcUyOHTsWZmWyf/LkSS/H7KJLiESbsB/+fNgPnbN2DJBBd0dalMWYWVePV6o/IiACIiACtSJQ2TEWu3btcufPn2/ADPv9N23a5McdcAMmckHEIl7HgfJ0pdhMDKIMJOoy84B8Ih+sLWFPyMjgOCmF9eiuWL58eaMe5bkZ2qwGpn9iF90o3CyJdpBwatjnvNnz/PPPu/Xr1zfs5NjGGmBL2K74GMcEmTgkdvNHT9gma0+Y541J+cOYDhtXQRuYBmpp27ZtjimllnDQiOLYeJA0BpTfvHmzVfNsrP2NTOcc8nuNPoVytC8CIiACIlAegUsYGFqeemnulwDRHBwoGwDar7yy6hPpweHrth3Lli3zESt9jcu6ctIrAiIgAs0EKtsV0mymjtIIMHuDmSGddp+kySkznzUucCpYt0RJBERABESg3gQq2xVSb6zFWk/Eos4rVtL1Q5eLdQEVS0/aREAEREAEsiSgiEWWNEuUVfebct3tL/HSS7UIiIAIVIqAxlhU6nLIGBEQAREQARGoNwFFLOp9/WS9CIiACIiACFSKgByLSl0OGSMCIiACIiAC9SYgx6Le10/Wi4AIiIAIiEClCMixqNTlkDEiIAIiIAIiUG8Ccizqff1kvQiIgAiIgAhUioAci0pdDhkjAiIgAiIgAvUmIMei3tdP1ouACIiACIhApQjIsajU5ZAxIiACIiACIlBvAnIs6n39ZL0IiIAIiIAIVIqAHItKXQ4ZIwIiIAIiIAL1JiDHot7XT9aLgAiIgAiIQKUIyLGo1OWQMSIgAiIgAiJQbwJyLOp9/WS9CIiACIiACFSKgByLSl0OGSMCIiACIiAC9SYgx6Le10/Wi4AIiIAIiEClCMixqNTlkDEiIAIiIAIiUG8Ccizqff1kvQiIgAiIgAhUioAci0pdDhkjAiIgAiIgAvUmIMei3tdP1ouACIiACIhApQjIsajU5ZAxIiACIiACIlBvAnIs6n39ZL0IiIAIiIAIVIqAHItKXQ4ZIwIiIAIiIAL1JvB/Jaomx5CM6tEAAAAASUVORK5CYII="
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### HighBit operation\n",
    "\n",
    "![image.png](attachment:image.png)\n",
    "\n",
    "| Operation  | function | Postive-Op                          | Negtive-Op                           | description | supported |\n",
    "|------------|----------|-------------------------------------|--------------------------------------|-------------|-----------|\n",
    "| Saturation | sat      | when(Top[w-1,w-n].orR) set maxValue | When(Top[w-1,w-n].andR) set minValue |    -         | Yes       |\n",
    "| Discard    | trim     | N/A                                 | N/A                                  |   -          | Yes       |\n",
    "| Symetric   | symetry  | N/A                                 | minValue=>-maxValue                  |   -          | Yes       |\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val a = in SInt(16 bits) //source data is 16 bits \n",
    "    val b = a.sat(8)         //saturation highest 8 bits, return 8 bits \n",
    "    val c = b.symmetry        //symetric 8 bits b (-128~128) to (-127 ~ 127), return 8 bits\n",
    " }\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Symetric** is very common in hardware design, because there is no need for bit width expansion and almost no performance loss during inversion\n",
    "```scala\n",
    "val a  = in SInt(8 bits)\n",
    "val b  = SInt(9 bits)\n",
    "    b := -a //9 bits is safe for inversion \n",
    "    \n",
    "val a1 = a.symetry    //return 8 bits(-128 ~127)\n",
    "val c  = SInt(8 bits)\n",
    "    c := -a1 //8 bits is safe (only lose -1 when -128 happen） \n",
    "```\n",
    "\n",
    "`symetric` only for SInt, UInt is no need Symetric"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAFbCAYAAAAJGvDvAAAgAElEQVR4Aey9e9AcxXn/2wQHczAgi8ABJB+ZSAgsQ5UNwg7GAoSJTQgELEwcqOIiSlyKQCHiEkQ/KHAMP1GUUBFBiaK4HQHilCjigEXJxvqDiItMZErcfoEIIUSMHF4gONxejLENvKc+Y55Nb+/M7Mzu3Hbf71O1OzN9eS7f7ul+prunZ5uxsbExJxICQkAICAEhIASEgBAoDIE/KoyTGAkBISAEhIAQEAJCQAhECMjBUkUQAkJACAgBISAEhEDBCMjBKhhQsRMCQkAICAEhIASEgBws1QEhIASEgBAQAkJACBSMgBysggEVOyEgBISAEBACQkAIyMFSHRACQkAICAEhIASEQMEIyMEqGFCxEwJCQAgIASEgBISAHCzVASEgBISAEBACQkAIFIyAHKyCARU7ISAEhIAQEAJCQAjIwVIdEAJCQAgIASEgBIRAwQjIwSoYULETAkJACAgBISAEhIAcLNUBISAEhIAQEAJCQAgUjIAcrIIBFTshIASEgBAQAkJACMjBUh0QAkJACAgBISAEhEDBCMjBKhhQsRMCQkAICAEhIASEgBws1QEhIASEgBAQAkJACBSMgBysggEVOyEgBISAEBACQkAIyMFSHRACQkAICAEhIASEQMEIyMEqGFCxEwJCQAgIASEgBISAHCzVASEgBISAEBACQkAIFIyAHKyCAa2T3RNPPOHsV6ceeWS/99577oUXXsiTpfFpb7jhhkp0pKy7Edi++uqr3ZLlir/qqqtypVdiISAEhMB4RGCbsbGxsfFo+DDafMIJJ7g33njDrVu3zm3YsMHNnDkzl5l0nBMmTHDnnXdernz9JEbnZ599tlAn66GHHnI//vGP3fr1693BBx/sjjnmGDd79myHM3f99dd3qHvJJZd0hMUFkP+OO+5IxQfn6u6773aPPvpoBwvi9ttvv0gXPxJ977rrrijolFNO6Yj30/rn++yzj1u5cmVqOZNm//33d/fee6+fNcKimy1tGbyLQw891B199NEuK25eVp0KASEgBMYNAhrBGqKiphOlY58+fXpuqxjpuP322911112XO28/Ga6++mq3ZMmSfli05b3//vvd2Wef7fbaay+3dOnS6NiWwDn31ltvRbaG4d2uN23aFDlPSenAEPzuueeetiQ4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wF577TU2e/bsSmSFQg4//PAxivo//uM/wqjSrx999NFI9ve///3SZcUJ+OxnPzsG9nXQvHnzItvXrl1bh/hI9ty5c2uRvffee4997nOfq0X2P/7jP9aK+/bbbz9WF+52r9cBPO0L7czy5cvrEC+ZQqBxCGgES262EBACQkAICAEhIAQKRkAOVsGAip0QEAJCQAgIASEgBORgqQ4IASEgBISAEBACQqBgBORgFQyo2AkBISAEhIAQEAJCQA6W6oAQEAJCQAgIASEgBApGQA5WwYCWwe6JJ55wvPZeByEX+eOVxrPtlHkd9r/wwguOX11U5/2Gzezjxa9qGu/3etV4S97wIyAHq8FlfNVVV7l99tnHHXTQQe7www93J5xwQqUdD/KQyyap6HHRRReVjpbZjLy4HzpVQchBvtl+5plnViE22kcozm7CqqYbbrghqntVOVl33XVXhPm+++7r+B166KHu/vvvr8xsK3O735DPvk5V09FHH+2uv/76SsXavY7t1LUq7vVKDZQwIVADAtrJPQPoND5sGgnddtttUQOUIVtfSXA0Lr30Ujdv3jy3cuXKiNeFF17ojj32WPfkk0+WvjM4ncvrr7/ulixZ4o477jhHZ3v++edHelxzzTV92ZaW+ZBDDomNfumllyLsjz/++Nj4IgOTbJ84caIr03ZseOyxxyJT5s6dW6RJuXkxgnTdddflztdrBhyZU089Narvq1evjtgsXrzYUd5r1651s2fP7pV1pnzc488++6y7/PLL3YwZM9zo6Ki77LLL3Nlnn+0efvhht+eee2bi028iHPl169Y5nKyqyGznXp88ebJbs2ZN1PZQ3y+55JKq1JAcITB8CDRuZ66GKbRp06Zo8zw20OO3bNmynjTMu9Ho9OnTx+bMmdMma3R0dIxwNrDMQ7b5YNaNRs3m0FbkIj8PFbXR6KxZs8b45aW8G42uWLEidpNKyiKv7b1sNNqrnXG4UF973fDS9IDHhg0b4tinhuXdaDQJ317qe96NRq2+U/Y+jYyMRGW+aNEiP7jreS8bjbIZLZhjL5jnlWlK2b1u192OSbb3cq9ro9FuaCt+vCGgKcIuPvMPf/jDKMX06dOj4913390lR//RTMls3rzZHXnkkW3M+L7Z7rvv7h555JG28KIveHqHJkyY0MaaJ9o6iKd6RtPuueee0sXfdNNNbtasWR0j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oCktfYcOAW0fMnRFKoOEwAAgoMe6ASikwVZRndtgl9+ga6/6N+glKP2FwKAioBGsikruvffec//8z//svvOd77jXXnvN/exnP4sk77jjjlHY008/7Z555pkobNq0aW7WrFluzZo1UVoCv/71r7u9997b3XHHHS2NjzrqqOicdEann366e/HFF1v899hjD0c60uy+++7uy1/+cgcPdEA3oyQe69atc1u2bImSmY7kwzYoTkfs+Id/+L6xrvy4detW9/vf/96hb9X0zjvvuFdffdVNmTLF7bDDDlWLd88//7ybMGGC23PPPSuXjd3vv/9+LbhjLLKPPPLP3d/+7d+23Udf+tKXonvAr7fcH93uAbtP4+6B8D7lnhuP9zptGziJhIAQ+AMCcrAqqgm33Xab++CDDyqS1i7m7rvvdps2bXLHHHNMe0QFV2+++aa7667/z+21117RrwKRbSL+z//5N4ej8+lPb98WXsUFmONofPjhR+6zn/1sFSLbZGzY8ISjs//oo+rf6Pz5z3/uPv7441pwf/vttx0PLAceOLMNj6ouli1b5v74j+v5/I7d68cff3xV5rbk2EOkPWi1InQiBMYrAmOiShBYunTp2O23316JrFDI8uXLx/7hH/5h7K233gqjSr9+5plnWIQ19v3vf790WXECZs+ePfapT30qLqr0sHnz5kW2r127tnRZcQLAfe7cuXFRpYftvffeY5/73OdKlxMnALyxfeXKlXHRpYf97//9v8d+9KMflS4nToDd63FxZYfRvtDOPPXUU2WLEn8hMBAIaA3WePWsZbcQEAJCQAgIASFQGgKaIiwN2nbGrE/41Kfqgfsb3/hGND1Zx/qIz3zmM+1A6EoIVITALrvsUpGkdjHHHnusmzx5cntgRVd2r1ckrk0M7QvrN3fddde2cF0IgfGKQD09/jhE+3Of+1xtVrPIui7adlt9lqQu7Me73O22264WCFhIXxfVea/zAMlaS5EQEAJ/QEBThBXVhOuuu67t7b2KxEZibr/9dveDH/zAsfi3anr33XerFil5QiBCgLd166BFixa5VatW1SHa2b1eh3DaF9oZXjAQCQEh4JwcLNUCISAEhIAQEAJCQAgUjIAcrIIBFbvhQuCJJ54YLoNyWlOH/S+88ILjJxICQkAIDDICWoNVUenNnz+/IkmdYr797W+77bffPvp1xpYb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jPx67d/DlIevj18+plMW7KlXtL2UHWT7jPlyTRc7prVHpKFscbC4NyBGbPy2yPiExzSMyA82piflzgOeT0m2WDh20v/49wz5fVx9fpxTD6ibEHUEm6weEWZ132y1epSGEbawBIA22+qXvw2OX5bIsPs4UqIBf9potAGFIBWGAwGexA488MDI0cnSSA6H1cVZgSPKuiwa1DinuldJONY4mL2uF+xVbhn5GLVgusemf0yGPXjFPRiRB8doGOw3e3FKoNCZtngdhUATEJCD1YRSkA5Dg4B1gKx14alYlA0BW0/IqGxRzhU8me5gisFfG5JNo+alMgeUkcrx6sBTP1ibyijoMDmMzatt0qgIBORgFYGieAgBDwGG75OmarxkOi0ZAabPd95556FyRpgKHK/OFdWF0Uim0cLlBSVXJbEXAj0hIAerJ9iUSQgIASEgBISAEBACyQjoLcJkbBQjBISAEBACQkAICIGeEJCD9f+3W4c2AAAACMP+/5oLZtDVBFO1i82JAAECBAgQINACAqttLAQIECBAgACBS0BgXWxOBAgQIECAAIEWEFhtYyFAgAABAgQIXAIC62JzIkCAAAECBAi0gMBqGwsBAgQIECBA4BIQWBebEwECBAgQIECgBQRW21gIECBAgAABApeAwLrYnAgQIECAAAECLSCw2sZCgAABAgQIELgEBNbF5kSAAAECBAgQaAGB1TYWAgQIECBAgMAlILAuNicCBAgQIECAQAsIrLaxECBAgAABAgQuAYF1sTkRIECAAAECBFpAYLWNhQABAgQIECBwCQyTntupubuzswAAAABJRU5ErkJggg=="
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Factory Function: `fixTo`\n",
    "\n",
    "two way are provided in UInt/SInt do fixpoint:\n",
    "\n",
    "![image.png](attachment:image.png)\n",
    "\n",
    "fixTo is strongly recommended in your RTL work, you don\\'t need handle   \n",
    "carry bit align and bit width calculate manually like Way1.\n",
    "\n",
    "Factory Fix function with Auto Saturation   \n",
    "\n",
    "| fuction                  | description         | Return            | others |\n",
    "|--------------------------|---------------------|-------------------|--------|\n",
    "| fixTo(section,roundType) | Factory FixFunction | section.size bits |        |\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val A = in SInt(10 bits)  \n",
    "    val B = A.roundToInf(3).sat(3)\n",
    " }\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val A = in SInt(10 bits)  \n",
    "    val B = A.fixTo(7 downto 3) //default RoundToInf, same as A.roundToInf(3).sat(3)\n",
    " }\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val A = in SInt(10 bits)  \n",
    "    val B = A.fixTo(7 downto 3, RoundType.ROUNDUP, sym=true) \n",
    " }\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Scala",
   "language": "scala",
   "name": "scala"
  },
  "language_info": {
   "codemirror_mode": "text/x-scala",
   "file_extension": ".scala",
   "mimetype": "text/x-scala",
   "name": "scala",
   "nbconvert_exporter": "script",
   "version": "2.11.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
